/*
 
 HLPView.m
 
 Coding for HLPViewController.m has used reference from the following link
 http://lievendekeyser.net/index.php?module=messagebox&action=message&msg_id=1351
 
 Author: Steven He <cha42@sfu.ca>
 
 Copyright (C) 2010 Green-Power
 
 URL: http://code.google.com/p/green-power
 
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation; either version 3 of the License, or
 (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 
 $Id$
 */

#import "HLPView.h"

#pragma mark -

@implementation HLPView

- (id)initWithImages:(NSArray *)inImages {
  if (self = [super initWithFrame:CGRectZero]) {
    mImages = [inImages retain];
		
    NSUInteger imageCount = [inImages count];
    if (imageCount > 0) {
      mCurrentImageView = [self createImageView:0];
      [self addSubview:mCurrentImageView];
			
      if (imageCount > 1) {
        mRightImageView = [self createImageView:1];
        [self addSubview:mRightImageView];
      }
    }
		
    self.opaque = YES;
    self.backgroundColor = [UIColor blackColor];
    self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
  }

  return self;
}

//Fundamental User gesture input will be handled here

- (UIImageView *)createImageView:(NSUInteger)inImageIndex {
  if (inImageIndex >= [mImages count]) {
    return nil;
  }
	
  UIImageView * result = [[UIImageView alloc] initWithImage:[mImages objectAtIndex:inImageIndex]];
  result.opaque = YES;
  result.userInteractionEnabled = YES;
  result.backgroundColor = [UIColor blackColor];
	
  result.contentMode = UIViewContentModeScaleAspectFit;
  result.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
  return result;
}

- (void)dealloc {
  [mImages release];
  [super dealloc];
}

// Make sure to fix all subviews on resize events
- (void)layoutSubviews {
  if (mSwiping)
    return;
	
  CGSize contentSize = self.frame.size;
  mLeftImageView.frame = CGRectMake(-contentSize.width, 0.0f, contentSize.width, contentSize.height);
  mCurrentImageView.frame = CGRectMake(0.0f, 0.0f, contentSize.width, contentSize.height);
  mRightImageView.frame = CGRectMake(contentSize.width, 0.0f, contentSize.width, contentSize.height);
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
  if ([touches count] != 1)
    return; // Ignore multitouch events
	
  mSwipeStart = [[touches anyObject] locationInView:self].x;
  mSwiping = YES;
	
  mLeftImageView.hidden = NO;
  mCurrentImageView.hidden = NO;
  mRightImageView.hidden = NO;
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
  if (! mSwiping || [touches count] != 1)
    return; // Do nothing if we are not swiping
	
  // This is how far we moved the finger, use this to displace all displayed iamges
  CGFloat swipeDistance = [[touches anyObject] locationInView:self].x - mSwipeStart;
	
  CGSize contentSize = self.frame.size;
	
  mLeftImageView.frame = CGRectMake(swipeDistance - contentSize.width, 0.0f, contentSize.width, contentSize.height);
  mCurrentImageView.frame = CGRectMake(swipeDistance, 0.0f, contentSize.width, contentSize.height);
  mRightImageView.frame = CGRectMake(swipeDistance + contentSize.width, 0.0f, contentSize.width, contentSize.height);
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
  if (! mSwiping)
    return;
	
  CGSize contentSize = self.frame.size;
	
  NSUInteger count = [mImages count];
	
  CGFloat swipeDistance = [[touches anyObject] locationInView:self].x - mSwipeStart;
  if (mCurrentImage > 0 && swipeDistance > 50.0f) {
    // We have moved right so far that the left image became the new center image
    // so shift our current position.
    [mRightImageView removeFromSuperview];
    [mRightImageView release];
		
    mRightImageView = mCurrentImageView;
    mCurrentImageView = mLeftImageView;
		
    mCurrentImage--;
    
    // What is the new left image?
    if (mCurrentImage > 0) {
      mLeftImageView = [self createImageView:mCurrentImage - 1];
      mLeftImageView.hidden = YES;
			
      [self addSubview:mLeftImageView];
    } else {
      mLeftImageView = nil;
    }
  }	else if (mCurrentImage < count - 1 && swipeDistance < -50.0f) {
    // We have moved left so far that the right image became the new center image
    // so shift our current position.

    [mLeftImageView removeFromSuperview];
    [mLeftImageView release];
		
    mLeftImageView = mCurrentImageView;
    mCurrentImageView = mRightImageView;
		
    mCurrentImage++;
    
    // What is the new right image
    if (mCurrentImage < count - 1) {
      mRightImageView = [self createImageView:mCurrentImage + 1];
      mRightImageView.hidden = YES;
			
      [self addSubview:mRightImageView];
    } else {
      mRightImageView = nil;
    }
  }
	
  // If we have not fully moved, then begin animating the transition 
  // to center the new center view (or return to the previous center view)
  [UIView beginAnimations:@"swipe" context:NULL];
  [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
  [UIView setAnimationDuration:0.3f];
  // These will be the final positions
  mLeftImageView.frame = CGRectMake(-contentSize.width, 0.0f, contentSize.width, contentSize.height);
  mCurrentImageView.frame = CGRectMake(0.0f, 0.0f, contentSize.width, contentSize.height);
  mRightImageView.frame = CGRectMake(contentSize.width, 0.0f, contentSize.width, contentSize.height);
	
  [UIView commitAnimations];
	
  mSwiping = NO;
}

@end //HLPView
